///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: signal.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 系统日志
//* QQ:	2085827949
//**********************************************************************/

// #include "flight.h"
#define _XOPEN_SOURCE       /* See feature_test_macros(7) */

#include "stdio.h"
#include "stdlib.h"
#include "lap_lib.h"
#include "laperro.h"


// 获取 时间
#include <sys/time.h>
/*
struct timeval {
  time_t      tv_sec;     /* seconds
  suseconds_t tv_usec;    /* microseconds
};
int gettimeofday(struct timeval *tv, NULL);
*/
void Lap_gettimeofday(void)
{
  struct timeval tv ={0};

  int ret = gettimeofday(&tv,NULL);
  LAP_NegErrRet(ret,1,"err!");
  printf("tv_sec:%d\ntv_usec:%d\r\n\r\n",tv.tv_sec,tv.tv_usec);
}



// 1970-01-01 00:00:00 +0000 (UTC). 获取时间戳
#include <time.h>
/*
  time_t time(time_t *tloc);  //time_t ->  long int  返回值为当前秒数
*/

void Lap_time()
{
  time_t tv,tvR;
  tvR = time(&tv);

  printf("secend:%d  tvR:%d\r\n\r\n",tv,tvR);
}






// 固定格式化时间函数 ctime
#include <time.h>
// char *ctime(const time_t *timep);              // 固定长度字符串 26byte 不可重入
// char *ctime_r(const time_t *timep, char *buf); // 可重入版本

void Lap_ctime()
{
  time_t tm;
  time(&tm);
  printf("ctime:\r\n");
  printf("time:%s\r\n", ctime(&tm) );
}




// 分解时间
#include <time.h>
/*
struct tm {
            int tm_sec;    /* Seconds (0-60) 
            int tm_min;    /* Minutes (0-59) 
            int tm_hour;   /* Hours (0-23) 
            int tm_mday;   /* Day of the month (1-31) 
            int tm_mon;    /* Month (0-11) 
            int tm_year;   /* Year - 1900 
            int tm_wday;   /* Day of the week (0-6, Sunday = 0) 
            int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) 
            int tm_isdst;  /* Daylight saving time 
};
// struct tm *gmtime(const time_t *timep);
// struct tm *gmtime_r(const time_t *timep, struct tm *result);

// struct tm *localtime(const time_t *timep);
// struct tm *localtime_r(const time_t *timep, struct tm *result);

// char *asctime(const struct tm *tm);
// char *asctime_r(const struct tm *tm, char *buf);
// time_t mktime(struct tm *tm);
*/

void Lap_gm_local_asc_mk_time()
{
  time_t timeT;
  struct tm* tm;

  time(&timeT);

  tm = gmtime(&timeT);
  printf("gm:\r\n");
  printf("tm_year:%d\r\n", tm->tm_year );
  printf("tm_mon:%d\r\n", tm->tm_mon );
  printf("tm_mday:%d\r\n", tm->tm_mday );
  printf("tm_wday:%d\r\n", tm->tm_wday );
  printf("tm_hour:%d\r\n\r\n", tm->tm_hour );


  tm = localtime(&timeT);
  printf("localtime:\r\n");
  printf("tm_year:%d\r\n", tm->tm_year );
  printf("tm_mon:%d\r\n", tm->tm_mon );
  printf("tm_mday:%d\r\n", tm->tm_mday );
  printf("tm_wday:%d\r\n", tm->tm_wday );
  printf("tm_hour:%d\r\n\r\n", tm->tm_hour );
 
  printf("asctime:%s",asctime(tm));     // 自带换行
  printf("mktime:%d\r\n\r\n",mktime(tm));
}



// 自定义 格式时间输出
#include <time.h>
#if 0
  
  %C     The century number (year/100) as a 2-digit integer. (SU) (Calculated from tm_year.)
  %d     The day of the month as a decimal number (range 01 to 31).  (Calculated from tm_mday.)
  %D     Equivalent to %m/%d/%y.  (Yecch—for Americans only.  Americans should note that in other countries %d/%m/%y is rather common.  This means that in interna‐
        tional context this format is ambiguous and should not be used.) (SU)

  %e     Like %d, the day of the month as a decimal number, but a leading zero is replaced by a space. (SU) (Calculated from tm_mday.)
  %E     Modifier: use alternative format, see below. (SU)
  %F     Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)
  %G     The ISO 8601 week-based year (see NOTES) with century as a decimal number.  The 4-digit year corresponding to the ISO week number (see %V).  This has  the
        same  format  and  value  as %Y, except that if the ISO week number belongs to the previous or next year, that year is used instead. (TZ) (Calculated from
        tm_year, tm_yday, and tm_wday.)

  %g     Like %G, but without century, that is, with a 2-digit year (00–99). (TZ) (Calculated from tm_year, tm_yday, and tm_wday.)
  %h     Equivalent to %b.  (SU)
  %H     The hour as a decimal number using a 24-hour clock (range 00 to 23).  (Calculated from tm_hour.)
  %I     The hour as a decimal number using a 12-hour clock (range 01 to 12).  (Calculated from tm_hour.)

  %j     The day of the year as a decimal number (range 001 to 366).  (Calculated from tm_yday.)
  %k     The hour (24-hour clock) as a decimal number (range 0 to 23); single digits are preceded by a blank.  (See also %H.)  (Calculated from tm_hour.)  (TZ)
  %l     The hour (12-hour clock) as a decimal number (range 1 to 12); single digits are preceded by a blank.  (See also %I.)  (Calculated from tm_hour.)  (TZ)
  %m     The month as a decimal number (range 01 to 12).  (Calculated from tm_mon.)
  %M     The minute as a decimal number (range 00 to 59).  (Calculated from tm_min.)
  %n     A newline character. (SU)
  %O     Modifier: use alternative format, see below. (SU)
  %p     Either "AM" or "PM" according to the given time value, or the corresponding strings for the current locale.  Noon is treated as "PM" and midnight as "AM".
        (Calculated from tm_hour.)

  %P     Like %p but in lowercase: "am" or "pm" or a corresponding string for the current locale.  (Calculated from tm_hour.)  (GNU)
  %r     The time in a.m. or p.m. notation.  In the POSIX locale this is equivalent to %I:%M:%S %p.  (SU)
  %R     The time in 24-hour notation (%H:%M).  (SU) For a version including the seconds, see %T below.
  %s     The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). (TZ) (Calculated from mktime(tm).)
  %S     The second as a decimal number (range 00 to 60).  (The range is up to 60 to allow for occasional leap seconds.)  (Calculated from tm_sec.)
  %t     A tab character. (SU)
  %T     The time in 24-hour notation (%H:%M:%S).  (SU)
  %u     The day of the week as a decimal, range 1 to 7, Monday being 1.  See also %w.  (Calculated from tm_wday.)  (SU)
  %U     The  week number of the current year as a decimal number, range 00 to 53, starting with the first Sunday as the first day of week 01.  See also %V and %W.
        (Calculated from tm_yday and tm_wday.)
  %V     The ISO 8601 week number (see NOTES) of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4  days  in
        the new year.  See also %U and %W.  (Calculated from tm_year, tm_yday, and tm_wday.)  (SU)

  %w     Theday of the week as a decimal, range 0 to 6, Sunday being 0.  See also %u.  (Calculated from tm_wday.)

  %W     The  week  number  of  the current year as a decimal number, range 00 to 53, starting with the first Monday as the first day of week 01.  (Calculated from
        tm_yday and tm_wday.)

  %x     The preferred date representation for the current locale without the time.

  %X     The preferred time representation for the current locale without the date.

  %y     The year as a decimal number without a century (range 00 to 99).  (Calculated from tm_year)

  %Y     The year as a decimal number including the century.  (Calculated from tm_year)

  %z     The +hhmm or -hhmm numeric timezone (that is, the hour and minute offset from UTC). (SU)

  %Z     The timezone name or abbreviation.

  %+     The date and time in date(1) format. (TZ) (Not supported in glibc2.)

  %%     A literal '%' character.
       ┌───────────┬───────────────┬────────────────────┐
       │Interface  │ Attribute     │ Value              │
       ├───────────┼───────────────┼────────────────────┤
       │strftime() │ Thread safety │ MT-Safe env locale │
       └───────────┴───────────────┴────────────────────┘
#endif
// size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);

void Lap_strftime()
{
  char buff[1024] ={0};
  time_t _tm = time(NULL);
  int len = strftime(buff,sizeof(buff),"%Y-%m-%d %T",localtime(&_tm));
  printf("strftime:%s \r\nlen:%d\r\n",buff,len);
}


#if 0
int main(void)
{
  LAP_ErrOutSet(NULL);
  Lap_gettimeofday();   // 获取时间戳
  Lap_time();           // 获取时间戳
  Lap_ctime();          // 固定时间格式
  Lap_gm_local_asc_mk_time();  // 分解时间
  Lap_strftime();       // 自定义格式化时间
  return 0;
}
#endif